package com.qingshu.common.util.model;

import com.qingshu.common.util.security.SecurityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Field;
import java.util.Date;

/**
 * 对象字段工具类
 *
 * @author Huzz
 * @created 2021-12-10 10:33
 */
public class FieldUtil {

    private static final Logger logger = LoggerFactory.getLogger(ModelUtil.class);

    /**
     * 为entity对象设置创建人id, 创建时间, 创建人名称
     *
     * @param entity
     */
    public static void setCreatedField(Object entity) {
        Field[] fields = entity.getClass().getDeclaredFields();
        try {
            for (Field field : fields) {
                // 禁止 Java 语言访问检查
                field.setAccessible(true);
                // 设置字段
                if ("createdUserId".equals(field.getName()) || "createUserId".equals(field.getName())) {
                    field.set(entity, SecurityUtils.getUserId());
                }
                if ("createdTime".equals(field.getName())
                        || "createTime".equals(field.getName())
                        || "createdDate".equals(field.getName())
                        || "createDate".equals(field.getName())) {
                    field.set(entity, new Date());
                }
                if ("createdUser".equals(field.getName())
                        || "createUser".equals(field.getName())
                        || "createdUsername".equals(field.getName())
                        || "createUsername".equals(field.getName())
                        || "createdUserName".equals(field.getName())
                        || "createUserName".equals(field.getName())) {
                    field.set(entity, SecurityUtils.getUsername());
                }
            }
        } catch (IllegalAccessException e) {
            logger.info("新增操作: 设置公共字段时,无权访问指定类、字段, 发生在{}.", entity);
        } catch (Exception e) {
            logger.info("新增操作: 设置公共字段发生错误: {}, 发生在{}.", e.getMessage(), entity);
        }
    }

    /**
     * 为entity对象设置修改人id, 修改时间, 修改人名称
     *
     * @param entity
     */
    public static void setUpdateField(Object entity) {
        Field[] fields = entity.getClass().getDeclaredFields();
        try {
            for (Field field : fields) {
                // 禁止 Java 语言访问检查
                field.setAccessible(true);
                if ("updateUserId".equals(field.getName())) {
                    field.set(entity, SecurityUtils.getUserId());
                }
                if ("updateUsername".equals(field.getName()) || "updateUserName".equals(field.getName())) {
                    field.set(entity, SecurityUtils.getUserId());
                }
                if ("updateTime".equals(field.getName()) || "updateDate".equals(field.getName())) {
                    field.set(entity, new Date());
                }
            }
        } catch (IllegalAccessException e) {
            logger.info("更新操作: 设置公共字段时,无权访问指定类、字段, 发生在{}.", entity);
        } catch (Exception e) {
            logger.info("更新操作: 设置公共字段发生错误: {}, 发生在{}.", e.getMessage(), entity);
            e.getStackTrace();
        }
    }

    /**
     * 判断对象是否存在某字段
     * @param entity
     * @param fieldName
     * @return
     */
    private boolean hasField(Object entity, String fieldName){
        Field[] fields = entity.getClass().getDeclaredFields();
        try {
            for (Field f : fields) {
                // 禁止 Java 语言访问检查
                f.setAccessible(true);
                if (fieldName.equals(f.getName())) {
                    return true;
                }
            }
        } catch (Exception e) {
            e.getStackTrace();
        }
        return false;
    }

    /**
     * 为entity对象设置创建人id, 创建人姓名, 创建时间, 修改人id, 修改时间, 修改人名称
     *
     * @param entity
     */
    public static void setCreatedAndUpdateField(Object entity) {
        FieldUtil.setCreatedField(entity);
        FieldUtil.setUpdateField(entity);
    }
}
